<!DOCTYPE html>
<html>
<head><meta charset="utf-8" />
<title>04-特殊属性和方法</title>

<script src="/lib/require/index.js"></script>
<script src="/lib/jquery/index.js"></script>

<!-- 改为引入外部样式 -->
<link rel="stylesheet" href="/css/custom.css">

<!-- Loading mathjax macro -->
<!-- Load mathjax -->
    <script src="/lib/mathjax/index.js"></script>
    <!-- MathJax configuration -->
    <script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [ ['$','$'], ["\\(","\\)"] ],
            displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
            processEscapes: true,
            processEnvironments: true
        },
        // Center justify equations in code and markdown cells. Elsewhere
        // we use CSS to left justify single line equations in code cells.
        displayAlign: 'center',
        "HTML-CSS": {
            styles: {'.MathJax_Display': {"margin": 0}},
            linebreaks: { automatic: true }
        }
    });
    </script>
    <!-- End of mathjax configuration --></head>
<body>
<div class="toc">
<ul>
                        
                        
                        <li class="toc-li-2">
                            <a href="#特殊属性和方法">特殊属性和方法</a>
                        </li>
                    
                
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#`__file__`">`__file__`</a>
                        </li>
                    
                
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#`__name__`">`__name__` </a>
                        </li>
                    
                
            
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#文件夹下的`__main__.py`-和-`__init__.py`">文件夹下的`__main__.py` 和 `__init__.py`</a>
                        </li>
                    
                
            
            
            
            
            
            
            
            
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#`__all__`">`__all__`</a>
                        </li>
                    
                
            
            
            
            
            
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#其他">其他</a>
                        </li>
                    
                
            
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#内建特殊属性">内建特殊属性</a>
                        </li>
                    
                
            
            
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#类属性调用原理">类属性调用原理</a>
                        </li>
                    
                
            
            
            
            
            
            
            
            
            
            
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#`__new__(cls,-[...)`">`__new__(cls, [...)`</a>
                        </li>
                    
                
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#`__init__(self,-[…)`">`__init__(self, […)`</a>
                        </li>
                    
                
            
            
            
                        
                        
                        <li class="toc-li-3">
                            <a href="#`__del__(self)`">`__del__(self)`</a>
                        </li>
                    
                
            
            
            
            </ul>
</div>
  <div tabindex="-1" id="notebook" class="border-box-sizing">
    <div class="container" id="notebook-container">

<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="&#29305;&#27530;&#23646;&#24615;&#21644;&#26041;&#27861;">&#29305;&#27530;&#23646;&#24615;&#21644;&#26041;&#27861;<a class="anchor-link" href="#&#29305;&#27530;&#23646;&#24615;&#21644;&#26041;&#27861;">&#182;</a></h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="__file__"><code>__file__</code><a class="anchor-link" href="#__file__">&#182;</a></h3><p>脚本执行的完整路径</p>
<h3 id="__name__"><code>__name__</code><a class="anchor-link" href="#__name__">&#182;</a></h3><ul>
<li>当用python test.py，则文件的<code>__name__</code>为<code>'__main__'</code>  </li>
<li>当脚本作为模块时，用python -m test.py，则文件的<code>__name__</code>为<code>'test'</code></li>
</ul>
<h3 id="&#25991;&#20214;&#22841;&#19979;&#30340;__main__.py-&#21644;-__init__.py">&#25991;&#20214;&#22841;&#19979;&#30340;<code>__main__.py</code> &#21644; <code>__init__.py</code><a class="anchor-link" href="#&#25991;&#20214;&#22841;&#19979;&#30340;__main__.py-&#21644;-__init__.py">&#182;</a></h3>
<pre><code>python3 xxx.py
python3 -m xxx.py

</code></pre>
<p>这是两种加载py文件的方式:</p>
<ol>
<li>叫做直接运行</li>
<li>相当于import,叫做当做模块来启动，前提是已加入sys.path</li>
</ol>
<p>python 将一个文件夹作为 package 对待，那么这个文件夹中必须包含一个名为 <code>__init__.py</code> 的文件，即使它是空的<br>
如果你需要 python 将一个文件夹作为 package 执行，那么这个文件夹中必须包含一个名为 <code>__main__.py</code> 的文件</p>
<h3 id="__all__"><code>__all__</code><a class="anchor-link" href="#__all__">&#182;</a></h3><p>对于from ModuleName import * 这种形式，要特别注意重名现象。</p>
<p>Python中，对于一个模块，具有一个名为 <code>__all__</code>的属性，该属性的值就是被from ModuleName import *这样的语句绑定的属性列表；否则，这种类型的from语句将绑定模块中除了以下划线开始的属性（私有属性）外的所有属性。这样的话，对于同一个名空间里 面出现重名现象的概率就加大了，为了减少这种情况的发生，都会在模块开始处定义<code>__all__</code>属性的内容，写出可以被这种from类型导入的属性
下面的是os.py里面的一段代码：</p>

<pre><code>__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep","defpath", "name", "path", "devnull"]

</code></pre>
<h3 id="&#20854;&#20182;">&#20854;&#20182;<a class="anchor-link" href="#&#20854;&#20182;">&#182;</a></h3>
<pre><code>__globals__: global namespace in which this function was defined
__file__: filename (missing for built-in modules)

</code></pre>
<h3 id="&#20869;&#24314;&#29305;&#27530;&#23646;&#24615;">&#20869;&#24314;&#29305;&#27530;&#23646;&#24615;<a class="anchor-link" href="#&#20869;&#24314;&#29305;&#27530;&#23646;&#24615;">&#182;</a></h3><p>用<code>dir(__builtins__)</code>查看内建特殊属性，特殊属性都是以双下划线开头和结尾</p>

<pre><code>'__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__'</code></pre>

</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="&#31867;&#23646;&#24615;&#35843;&#29992;&#21407;&#29702;">&#31867;&#23646;&#24615;&#35843;&#29992;&#21407;&#29702;<a class="anchor-link" href="#&#31867;&#23646;&#24615;&#35843;&#29992;&#21407;&#29702;">&#182;</a></h3><table>
<thead><tr>
<th style="text-align:center">目的</th>
<th style="text-align:center">所编写代码</th>
<th>Python 实际调用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">类构造器</td>
<td style="text-align:center">x = MyClass()</td>
<td><code>x.__new__()</code></td>
</tr>
<tr>
<td style="text-align:center">类析构器</td>
<td style="text-align:center">del x</td>
<td><code>x.__del__()</code></td>
</tr>
<tr>
<td style="text-align:center">只定义特定集合的某些属性</td>
<td style="text-align:center"></td>
<td><code>x.__slots__()</code></td>
</tr>
<tr>
<td style="text-align:center">自定义散列值</td>
<td style="text-align:center">hash(x)</td>
<td><code>x.__hash__()</code></td>
</tr>
<tr>
<td style="text-align:center">获取某个属性的值</td>
<td style="text-align:center">x.color</td>
<td><code>type(x).__dict__['color'].__get__(x, type(x))</code></td>
</tr>
<tr>
<td style="text-align:center">设置某个属性的值</td>
<td style="text-align:center">x.color = 'PapayaWhip'</td>
<td><code>type(x).__dict__['color'].__set__(x, 'PapayaWhip')</code></td>
</tr>
<tr>
<td style="text-align:center">删除某个属性</td>
<td style="text-align:center">del x.color</td>
<td><code>type(x).__dict__['color'].__del__(x)</code></td>
</tr>
<tr>
<td style="text-align:center">控制某个对象是否是该对象的实例</td>
<td style="text-align:center">isinstance(x, MyClass)</td>
<td><code>MyClass.__instancecheck__(x)</code></td>
</tr>
<tr>
<td style="text-align:center">控制某个类是否是该类的子类</td>
<td style="text-align:center">issubclass(C, MyClass)</td>
<td><code>MyClass.__subclasscheck__(C)</code></td>
</tr>
<tr>
<td style="text-align:center">控制某个类是否是该抽象基类的子类</td>
<td style="text-align:center">issubclass(C, MyABC)</td>
<td><code>MyABC.__subclasshook__(C)</code></td>
</tr>
</tbody>
</table>

</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="__new__(cls,-[...)"><code>__new__(cls, [...)</code><a class="anchor-link" href="#__new__(cls,-[...)">&#182;</a></h3><p><code>__new__</code> 是在一个对象实例化的时候所调用的第一个方法。它的第一个参数是这个类，其他的参数是用来直接传递给 <code>__init__</code> 方法。 <code>__new__</code> 方法相当不常用,但是它有自己的特性，特别是当继承一个不可变的类型比如一个tuple或者string。</p>

</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="__init__(self,-[&#8230;)"><code>__init__(self, [&#8230;)</code><a class="anchor-link" href="#__init__(self,-[&#8230;)">&#182;</a></h3><p>此方法为类的初始化方法。当构造函数被调用的时候的任何参数都将会传给它。</p>
<blockquote><p>调用 x = SomeClass(10, 'foo')，那么 <strong>init</strong> 将会得到两个参数10和foo。</p>
</blockquote>

</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="__del__(self)"><code>__del__(self)</code><a class="anchor-link" href="#__del__(self)">&#182;</a></h3><p>如果 <code>__new__</code> 和 <code>__init__</code> 是对象的构造器的话，那么 <code>__del__</code> 就是析构器。它不实现语句 del x (以上代码将不会翻译为 <code>x.__del__()</code> )。它定义的是当一个对象进行垃圾回收时候的行为。当一个对象在删除的时需要更多的清洁工作的时候此方法会很有用，比如套接字对象或者是文件对象。注意，如果解释器退出的时候对象还存存在，就不能保证 <code>__del__</code> 能够被执行，所以 <code>__del__</code> can’t serve as a replacement for good coding practices ()<del>~</del>~</p>
<p><a href="http://dipyzh.bitbucket.org/special-method-names.html">特殊属性调用机制</a></p>

</div>
</div>
</div>
    </div>
  </div>
</body>

 


</html>
